单链表 C++源码 构造 查找 插入 删除 反序 打印 头文件设定

分为三个文件
一个 - LinkList_test.h 头文件,用于设定链表节点结构体,以及功能函数名称,存储内容结构体。
一个 - LinkList.cpp 文件,用于实现各类功能函数。
一个 - main.cpp 文件,用于运行。
IDE:CodeBlocks

LinkList.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using namespace std;

struct Info //存储数据结构体
{
int data;
};

struct Node
{
Info val;
Node *next;
Node(Info x):val(x),next(NULL){}//设定初始值
};

class LinkList
{
public:
//构造
void Creat();
//在链表头部插入结点
void InsertHead(Info val);
//插入结点
void Insert(Info val,int pos);
//删除结点
void Remove(Info val);
//得到链表长度
int Length();
//链表反序
void Reverse();
//查找结点位置
int Find(Info val);
//打印链表
void Print();
//析构函数
~LinkList();
private:
Node *head;
int length;
};

LinkList.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "LinkList_test.h" //注意要用双引号
using namespace std;


//构造函数
void LinkList::Creat()
{
head = (Node *)malloc(sizeof(Node));
length = 10;
Node *s;
s = (Node *)malloc(sizeof(Node));
Node *q;
q = (Node *)malloc(sizeof(Node));
Node *temp;
s = head;
head->next = q;
for(int i=1; i<=length; ++i)
{
if(i == 1)
{
s->val.data = i;
continue;
}
temp = (Node *)malloc(sizeof(Node));
temp->val.data = i;
s->next = temp;
s = temp;
}
temp->next = NULL;
}

//析构函数
LinkList::~LinkList()
{
Node *temp;
for(int i=0; i<length; ++i)
{
temp = head;
head = head->next;
delete temp;
}
}

//链表长度
int LinkList::Length()
{
return length;
}

//插入数据
void LinkList::Insert(Info val,int pos)
{
Node *index = head;
if(pos == 1)
{
Node *temp = new Node(val);
temp->next = head;
head = temp;
length++;
}
if(pos > 1)
{
int i = 1;
while(i < pos)
{
index = index->next;
i++;
}
Node *temp = new Node(val);
temp->next = index->next;
index->next = temp;
length++;
}

}

//查找数据位置
int LinkList::Find(Info val)
{
Node *index = head;
int pos = 1;
while(index)
{
if(val.data == index->val.data)
{
cout<<"Find in No."<<pos<<endl;
return pos;
}

index = index->next;
pos++;
}
return 0;
}

//删除数据
void LinkList::Remove(Info val)
{
int pos = Find(val);
if(pos)
{
Node *index = head;
if(pos == 1 && length != 1)
{
head = head->next;
delete index;
length--;
}
if(pos != 1 && pos != length)
{
int i = 1;
while(i < pos-1)
{
index = index->next;
i++;
}
Node *temp = index->next;
index->next = index->next->next;
delete temp;
length--;
}
if(pos == length)
{
int i = 1;
while(i < pos-1)
{
index = index->next;
i++;
}
delete index->next;
index->next = NULL;
length--;

}
Remove(val);
}
else
cout<<"已无此数据"<<endl;
}

//链表反序
void LinkList::Reverse()
{
Node *q = head;
Node *p = head->next;
Node *temp = NULL;
head-> next = NULL;
while(p)
{
temp = p->next;
p->next = q;
q = p;
p = temp;
}
head = q;
}

//打印链表
void LinkList::Print()
{
Node *cursor = head;
while(cursor)
{
cout<<cursor->val.data<<endl;
cursor = cursor->next;
}
}

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// main.cpp : 测试链表功能。
#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <string>
#include "LinkList_test.h"
using namespace std;

int main()
{
LinkList head;
head.Creat();
cout<<"The LinkedList is:"<<endl;
head.Print();

Info val01;
val01.data = 7;


//插入测试
cout<<"Insert test:"<<endl;
head.Insert(val01,1);
head.Print();


//测试反序功能
cout<<"reverse test:"<<endl;
head.Reverse();
cout<<"reversed linklist is:"<<endl;
head.Print();


//测试删除功能
cout<<"remove test:"<<endl;
cout<<"the length of linklist is:"<<endl;
cout<<head.Length()<<endl;
head.Remove(val01);
cout<<"after remove:"<<endl;
head.Print();

return 0;
}

参考博客:https://blog.csdn.net/kevin_zhai/article/details/50494020
但Kevin的博客中有部分代码有误

Author: XuYuyao
Link: http://xyyhub.github.io/2019/08/17/单链表 C++源码 构造 查找 插入 删除 反序 打印 头文件设定/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.

Comment